import { ConfigEnv, defineConfig, loadEnv, UserConfig } from 'vite';
import viteBasicSslPlugin from '@vitejs/plugin-basic-ssl';
import {
	setupBuild,
	setupCommonPlugins,
	setupCompress,
	setupPostcss,
	setupServer,
	setupTerser,
	setupVisualizer,
	setupVitePwa
} from './viteConfig';
// @ts-ignore
import os from 'os';
// 详细请查看https://vitejs.dev/config/
/** @type {import('vite').UserConfig} */
export default defineConfig(async (configEnv: ConfigEnv): Promise<UserConfig> => {
	const cpuCount: number = os.cpus().length;
	// 可以获取当前系统运行环境变量
	// const systemEnv = loadEnv(configEnv['mode'], configEnv['command'],'');
	// 可以获取当前目录下的环境变量
	const env: Record<string, string> = loadEnv(configEnv['mode'], process.cwd());
	console.log('CPU核心数:', cpuCount);
	console.log(`正在使用[${configEnv['mode']}]模式`);
	console.log(env);
	const config: UserConfig = {
		// 重新定义index.html的初始位置
		/*root      : `${process.cwd()}/public/`,*/
		base      : './',
		publicDir : 'public',
		appType   : 'spa',
		cacheDir  : `${process.cwd()}/viteCache/`,
		// 调试地址
		server  : setupServer(),
		resolve : {
			alias : {
				'@' : '/src/'
			},
			// 除了两类的文件后缀,其余扩展名都不自动匹配
			// ↓↓↓↓Vite默认是↓↓↓↓
			// ['.mjs', '.js', '.mts', '.ts', '.jsx', '.tsx', '.json']
			extensions : ['.mjs', '.mts']
		},
		// CSS处理
		css     : {
			devSourcemap : true,
			modules      : {
				scopeBehaviour : 'global',
				// 局部变量转换
				localsConvention : undefined
			}
		},
		plugins : setupCommonPlugins(configEnv),
		build   : setupBuild()
	};
	if ('development' === configEnv['mode']) {
		// 开发模式配置
		// 开发模式下使用esbuild优化器,提升调试速度,甚至可以关闭
		config['build']!['minify'] = 'esbuild';
		// config['build']['minify'] = false;
		// 开发模式下打开sourcemap以提升开发体验
		config['build']!['sourcemap'] = 'inline';
		// @ts-ignore
		config['plugins']!.push(viteBasicSslPlugin());
	} else if ('production' === configEnv['mode']) {
		// 生产模式配置
		// 生产模式下使用terser优化器,极致缩小JS体积
		config['build']!['minify'] = 'terser';
		// 提供给terser优化器的参数
		config['build']!['terserOptions'] = setupTerser();
		// 生产模式下不写出sourcemap以降低体积
		config['build']!['sourcemap'] = false;
		// 生产模式下需要优化CSS的体积
		config['css']!['postcss'] = setupPostcss();
		// 生产模式下需要压缩项目的体积
		// 使用br仅支持https模式下使用
		// 使用gzip兼容性更好,且支持非https模式,但压缩后的体积比br要大
		config['plugins']!.push(setupCompress());
		// 生产模式下启用打包视图,用于分析打包之后的区块
		config['plugins']!.push(setupVisualizer());
		// 生产模式下启用pwa,用于优化浏览器缓存机制
		config['plugins']!.push(setupVitePwa());
	}
	return config;
});